<?php
namespace app\common;
use think\Exception;
class WebTool
{
	/**
	 * websort 递归冒泡排序方式
	 * @param  array 	$array 	需要进行排序的数组
	 * @param  integer 	$pid 	需要传入的终结条件
	 * @return array 			返回重新整理后的数组
	 */
	public static function bubbleSort($array,$pid=0)
	{
		/**
		 * bubbleSort_check 函数自检功能
		 */
		$bubbleSort_check = function ($array,$pid)
		{
			// 参数检测
			if (empty($array)) $error = 'WebTool_bubbleSort_Paramone_NotEmpty';
			if (!is_array($array)) $error = 'WebTool_bubbleSort_Paramone_NeedArray';
			if (!is_numeric($pid)) $error = 'WebTool_bubbleSort_Paramtwo_Neednum';
			// 检测结果判断
			if (isset($error))
			{
				throw new Exception($error);
				return $error;
			}
			return true;
		};

		/**
		 * bubbleSort_run 函数执行功能
		 */
		$bubbleSort_run = function ($array,$pid)
		{				
			// 内部静态数组声明
			static $arr = [];
			// 循环数据
			foreach ($array as $key => $val)
			{
				// 如果循环的值与父类id相等，则进行递归
				if ($val['pid'] == $pid)
				{
					// 讲改值放入本函数中
					$arr[] = $val;
					// 调用本函数
					bubbleSort_run($arr,$val['id']);
				}		
			}
			return $arr;
		};
		
		// 自检函数
		$res = $bubbleSort_check($array,$pid);
		if (true !== $res) return $res;
		// 运行函数
		$array = $bubbleSort_run($array,$pid);
		return $array;
	}

	/**
	 * arrayKeyValPair 二维数组生产一个指定的一维键值对数组
	 * @author  dreamcc chongzia@sina.cn
	 * @param  array $array 传入一个二维数组
	 * @param  string $key   该数组中的其中一个值作为键
	 * @param  string $val   该数组中的其中一个值作为值
	 * @return array        返回这个数组
	 */
	public static function arrayKeyValPair($array,$key,$val)
	{

		/**
		 * arrayKeyValPair_check 函数自检功能
		 */
		$arrayKeyValPair_check = function ($array,$key,$val,$_num)
		{
			// 参数空判断
			if (empty($array)) $error = 'WebTool_arrayKeyValPair_Paramone_NotEmpty';
			if (empty($key)) $error = 'WebTool_arrayKeyValPair_Paramtwo_NotEmpty';
			if (empty($val)) $error = 'WebTool_arrayKeyValPair_Paramthree_NotEmpty';
			// 参数类型判断
			if (!is_array($array)) $error = 'WebTool_arrayKeyValPair_Paramone_Needarray';
			if (!is_string($key)) $error = 'WebTool_arrayKeyValPair_Paramtwo_Needstring';
			if (!is_string($val)) $error = 'WebTool_arrayKeyValPair_Paramthree_Needstring';
			// 特定数据检测维度检测
			if (2 != $_num) $error = 'WebTool_arrayKeyValPair_Paramone_Musttwodimensional';
			foreach ($array as $k => $v)
			{
				// 检测键是否存在于数组中
				if (!array_key_exists($key,$v)) $res = false;
				// 检测值是否存在于数组中
				if (!array_key_exists($val,$v)) $res = false;
			}
			if (isset($res) && false === $res) $error = 'WebTool_arrayKeyValPair_Keyorvalue_Notexist';
			// 检测结果判断
			if (isset($error))
			{
				throw new Exception($error);
				return $error;
			}
			return true;
		}

		/**
		 * arrayKeyValPair_sotr 函数维度读取功能
		 */
		$arrayKeyValPair_sotr = function ($array)
		{
			// 如果不是数组 返回0
			if(!is_array($array)) return 0;
			// 初始化统计数据
			$count = 1;
			// 魂环数组
			foreach ($array as $key => $val)
			{
				// 判断循环的值是否依然是数组
				if (is_array($val))
				{
					// 如果是数组 则进行递归调用并且结果+1
					$depth = arrayKeyValPair_sotr($val) + 1;
					// 如果递归结果大于统计预期 讲递归结果复制给统计
					if ($depth > $count) $count = $depth;
				}
			}
			// 统计结果
			return $count;
		}

		/**
		 * arrayKeyValPair_run 函数运行功能
		 */
		$arrayKeyValPair_run = function ($array,$key,$val)
		{
			//将二维数组中的id取出
			$keyArray = array_column($array,$key);
			//将二维数组中的名称取出
			$valArray = array_column($array,$val);
			//从新合并成一维数组数组
			$array = array_combine($keyArray,$valArray);
			// 返回这个数组
			return $array;
		}

		// 函数维度获取
		$_num = $arrayKeyValPair_sotr($array);
		// 函数自检
		$res = $arrayKeyValPair_check($array,$key,$val,$_num);
		if (true !== $res) return $res;
		// 运行函数
		$array = $arrayKeyValPair_run($array,$key,$val);
		// 返回结果
		return $array;
	}
		
	/**
	 * arrayDimension 数组的维度统计
	 * @param  array $array 传入一个数组
	 * @return int        返回该数组的维度
	 */
	public static function arrayDimension($array)
	{
		if ($array ==='help') exit(arrayDimension_help());
		// 如果不是数组 返回0
		if(!is_array($array)) return 0;
		// 初始化统计数据
		$count = 1;
		// 魂环数组
		foreach ($array as $key => $val)
		{
			// 判断循环的值是否依然是数组
			if (is_array($val))
			{
				// 如果是数组 则进行递归调用并且结果+1
				$depth = self::arrayDimension($val) + 1;
				// 如果递归结果大于统计预期 讲递归结果复制给统计
				if ($depth > $count) $count = $depth;
			}
		}
		// 统计结果
		return $count;
	}
}